package com.eltsistemas.controller.afastamento;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.hibernate.Session;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;

import com.eltsistemas.dao.AutorizacaoDao;
import com.eltsistemas.dao.GenericDao;
import com.eltsistemas.hibernate.HibernateUtil;
import com.eltsistemas.modelo.Afastamento;
import com.eltsistemas.modelo.Autorizacao;
import com.eltsistemas.modelo.Autorizacao_Afastamento;
import com.eltsistemas.modelo.Usuario;

@Controller
@SessionAttributes(value="usuario_Logado")
@RequestMapping(value="/afastamento")
public class AfastamentoAutorizacao {
	
	@RequestMapping(value="/autorizacao")
	@ResponseBody
	public List<Autorizacao_Afastamento> exibe(Afastamento afastamento)
	{
		//Iniciando conexao a abrindo uma transacao
		Session session = new HibernateUtil().getSession();
		session.beginTransaction();

		List<Autorizacao_Afastamento> aut_AfastamentoList_Aux = new ArrayList<>();
		
		AutorizacaoDao daoAutorizacao = new AutorizacaoDao(session);
		
		List<Autorizacao_Afastamento> aut_AfastamentoList = daoAutorizacao.autorizacao_AfastamentoList(afastamento);
		for(Autorizacao_Afastamento aut_Afastamento : aut_AfastamentoList)
		{
			
			Autorizacao_Afastamento autorizacao_Afastamento = new Autorizacao_Afastamento();
			autorizacao_Afastamento.setData( aut_Afastamento.getData() );
			autorizacao_Afastamento.setDescricao( aut_Afastamento.getDescricao() );
			autorizacao_Afastamento.setAprovado( aut_Afastamento.isAprovado() );
			
			Usuario usuario = new Usuario();
			usuario.setLogin(aut_Afastamento.getUsuario().getLogin());
			
			autorizacao_Afastamento.setUsuario( usuario );
			aut_AfastamentoList_Aux.add(autorizacao_Afastamento);
		}
		
		//Finalizando conexao
		session.close();

		return aut_AfastamentoList_Aux;
	}
	
	@RequestMapping(value="aprovacao")
	public String aprovacao(Long id_Afastamento, String nomeFuncionario,
							Autorizacao autorizacao, @ModelAttribute("usuario_Logado") Usuario user)
	{
		//Iniciando conexao a abrindo uma transacao
		Session session = new HibernateUtil().getSession();
		session.beginTransaction();
		
		//Carrega o objeto afastamento a partir do nome
		GenericDao<Afastamento> daoAfastamento = new GenericDao<>(session, Afastamento.class);
		Afastamento afastamento = daoAfastamento.findById( id_Afastamento );
		
		//Incluindo a autorizacao
		Autorizacao_Afastamento aut_Afastamento = new Autorizacao_Afastamento();
		aut_Afastamento.setData(Calendar.getInstance());
		aut_Afastamento.setDescricao( autorizacao.getDescricao() );
		aut_Afastamento.setAfastamento( afastamento );
		
		aut_Afastamento.setUsuario(user);
		
		GenericDao<Autorizacao_Afastamento> daoAut_Afastamento = new GenericDao<>(session, Autorizacao_Afastamento.class);
		
		/*
		 * Se o afastamento for reprovado, o atributo aprovado=false
		 */
		if(autorizacao.isAprovado() == true)
		{
			//Atualiza o atributo aprovado e nivel
			aut_Afastamento.setAprovado(true);
			aut_Afastamento.setNivel( user.getNivel_Autorizacao() );
		}
		
		else
		{
			//Atualiza o atributo status_Atual
			afastamento.setStatus_Atual(false);
			aut_Afastamento.setNivel( 0 );
				
			/*
			 * Salava o objeto na session
			*/
			session = daoAfastamento.altera(afastamento);
		}
		
		/*Salvando objeto no session, comitando os dados no banco e
		 * finalizando a conexao
		*/
		session = daoAut_Afastamento.adiciona(aut_Afastamento);
		session.getTransaction().commit();
		session.close();
		
		return "redirect:lista?nomeFuncionario="+nomeFuncionario;
		
	}
}
